import axios from 'axios'
import { Toast } from 'vant'
import router from '@/router'
import { getLocalToken, removeLocalToken } from '@/utils/token.js'
import JSONbig from 'json-bigint'
const _fetch = axios.create({
  baseURL: process.env.VUE_APP_URL,
  transformResponse: [
    function (data) {
      return JSONbig.parse(data)
    }
  ]
})
// 添加请求拦截器
_fetch.interceptors.request.use(
  function (config) {
    // console.log(config)
    // 在发送请求之前做些什么
    // 如果在api各接口中定义了needToken，那么就在headers加上相应的参数
    if (config.needToken) {
      config.headers.Authorization = `Bearer ${getLocalToken('token')}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
_fetch.interceptors.response.use(
  function (res) {
    // return res
    // 对响应数据做点什么
    // console.log(res)
    if (res.status === 200 || res.status === 201) {
      // 如果返回的后台状态码为200成功，那么就对数据进行过滤
      return res.data
    } else if (res.status === 401 || res.status === 403) {
      // 这里处理token过期的情况
      //   1.对登录页进行特殊的处理
      if (res.config.specialHander) {
        removeLocalToken('token')
        return Promise.reject(new Error('token过期'))
      } else {
        // 2.对登录页以外的页面进行处理
        // 提示用户
        Toast.fail('登录过期，请重新登录')
        // 设置登录状态

        // 删除token
        removeLocalToken('token')
        // 跳转到登录页
        router.push('/login?redirect=' + window.location.href.split('#')[1])
        // 返回错误阻止.then执行
        return Promise.reject(new Error(res.data.message))
      }
    } else {
      // 这里处理返回的状态码不对的情况，说明请求出现了问题
      //   提示用户
      Toast.fail(res.data.message)
      return Promise.reject(new Error('请求失败'))
    }
  },
  async function (err) {
    // 对响应错误做点什么
    // console.log('err')
    // console.log(err)
    return Promise.reject(err)
  }
)

export default _fetch
